Одной из самых важных и приятных особенностей сетевого кода Half-Life является независимоть скорости игры (читай FPS'ов, отрендеренных кадров в секунду) от скорости связи. Раньше машина-клиент должна была подтверждать каждый новый прорисованный кадр у сервера. Получалось, что игра по модему тормозила даже на сильных компьютерах. Даже людям сидящим на толстых каналах приходилось туго, ибо не получалось зачастую достичь хорошего качества связи вкупе с хорошими 72 FPS'ами. Видать, пограммерам из Valve здорово пропердолили на работе и те быстренько сваяли новый патч. Отныне кол-во FPS'ов и скорость связи полностью не зависят друг от друга! Теперь даже если вы "модемщик", то 100 FPS'ов вам запросто доступно, тянул бы комп.

В Valve так же поработали и над "компенсацией лагов" при стрельбе, сделав игру по модему почти такой же гладкой, как игру на LAN'е. Обсчет результатов стрельбы полностью берет на себя сервер, что означает полную безопасность! (Сделаю некоторые пояснения от себя: обсчет стрельбы и прочего на стороне клиента дает большой простор для читеров, т.к. взломать сетевой код становится очень просто. Помните несколько лет назад ситуацию с Diablo - сколько было читов? Никто честно не играл на www.battle.net, потому что все герои и их передвижения обсчитывались на компах игроков. С выходом старкрафта и Diablo2 ситуация поменялась.) Плюс ко всему Valve значительно снизила траффик при сетевой игре, сделав код значительно эффективней. Словом, модемщики теперь могут расчехлить свои кольты с калашами и играть в замесах с меньшим чем раньше лагами. А самое главное - теперь к сетевому коду доступно огромное множество настроек.

Основные принципы работы

Предвижу вопросы - как это тамошним программерам удалось компенсировать лаги, почти уровняв ЛАНщиков и модемщиков? Решение, как все гениальное, просто и элегантно: представьте себе палящего в противника "модемщика" с пингом 200. Сервер отслеживает выстрел и засекает пинг стреляющего игрока (допустим, 200 миллисекунд), затем сервер проверяет где был его противник 200 миллисекунд назад и если он в то время действительно подпал под пулю, то выстрел засчитывается как попадание, иначе - мимо.

Есть, однако, и свои недостатки. Первый и наиболее заметный - это эффект облетающих углы пуль, когда игрок LAN уже забежал за угол, а для игрока по модему - еще нет и второй убил первого. Понятно, что существует некоторая задержка пока сервер обработает сответсвующие пакеты и поймет что на самом деле вас уже подстрелили, прежде чем вы скрылись за углом. Так что правосудие вас все равно настигнет ;) Иногда это раздражает, но это лучше, чем было раньше. Другой недостаток заключается в том, что когда вы стреляте по кому либо, то реальные попадания проявляются немного позже чем если бы вы играли по локальной сетке. Если враг убил вас прежде чем сервер успел обсчитать ваши выстрелы, то вы проигрываете в любом случае, независимо от того попали вы по врагу или нет (т.е. фактически независимо от того, убили бы вы его до того, как он успел убить вас). В этом смысле люди имеющие меньший пинг все еще обладают некоторыми преимуществами. Стоят ли эти недостатки указанных выше достоинств - решать вам.

Итак, Вы - обладатель обычного Dial-Up модема, желающий поиграть на сервере какого-либо Интернет провайдера. Приступим.

Совет 1. Операционная система.

Фактически, все, к чему Вы стремитесь - это уменьшить ping, чтобы быстро сносить бошки. Так вот, экспериментально выяснено, что скорость передачи и приема данных между игровым сервером и операционной системой у Windows 9x выше, чем у ее последователей, то есть Windows 2000 и XP. Так что если у Вас есть возможность, то для игры надо грузить Windows 95/98, а не красочную и медленную Windows 2000/XP.

Совет 2. Канал связи.

Как было сказано выше, для игры предпочтительнее выбирать Windows 95/98, так как в ней меньше наворотов и пакеты (данные) меньше задерживаются в недрах операционной системы, в следствие чего, быстрее попадают к адресату.

Также быстрее попадать к адресату пакеты будут, если качество соединения у Вас с провайдером будет стабильным и пакетов теряться будет немного. Поэтому, в линию модем должен выходить не на максимальной скорости, а на немного меньшей. Например, если к провайдеру он подключается на скорости 52000, то для игры Вам достаточно использовать скорость порядка 48000, не выше. Эта маленькая операция повысит надежность Вашего соединения и уменьшит лаги, так что в следующий раз, когда тебя кто-либо попытается добить ножом, ты не будешь висеть и успеешь увернуться.

Нелишне будет также напомнить Вам, что кроме Half-Life и Cheating-Death, больше во время игры не должно быть запущено ничего. Большинство современных программ умеют работать с Интернетом и будут забивать Вам канал разным хламом. Я думаю, Вы не обрадуетесь, если в самый разгар битвы ICQ отключит Вас от игры и сообщит Вам, что пришло новое сообщение.

Еще одной преградой на пути пакетов в сеть может служить модуль сжатия данных. Как ни странно, но на это тоже тратятся драгоценные миллисекунды, так что сжатие данных и заголовков IP должно быть отключено.

Совет 3. Движок Half-Life.

Предположим, что Вы воспользовались советами 1 и 2, но играть Вы все равно не можете. Перейдем к настройке той части Half-Life, которая отвечает за передачу информации между Вами и игровым сервером. Сразу скажем, что скорее всего с первого раза настроить движок так, чтобы можно было играться Вам не удастся. Для каждой линии здесь нужны свои настройки.

  • Уменьшение загруженности канала:

    Как уже говорилось, во время игры, кроме Cheating Death и самого CS не должно быть запущено больше ничего. Многие программы умеют работать с интернетом и будут вам лишний раз во время игры забивать канал. Сам Counter-Strike тоже умеет работать с интернетом не хуже других. Вот, чем CS умеет испортить до невозможности вам игру:

  • cl_allowupload 0-1 Эта команда запрещает (0) или разрешает (1) закачку с Вашей стороны на сервер всякого мусора, типа логов игроков. Если cl_allowupload = 0, то Вы избавите других игроков от сомнительного удовольствия созерцать вашу мазню, а себе не будете забивать канал.
    cl_allowdownload 0-1 Позволяет или запрещает скачивание с сервера логосов (мазни других игроков) и новых карт (если карты, крутящейся на серваке, у вас нет и cl_allowdownload = 0, то вас просто выкинет с него). Модемщикам я бы посоветовал отрубить, т.е. проставить cl_allowdownload в 0. Скачивание логосов затягивает загрузку, а новую карту быстрее слить через web в заархивированном виде и потом самому распаковать.
    cl_download_ingame 0-1 Значение 0 запрещает скачивание вами новых логосов игроков, которые подсоединились на сервер в момент игры. Для модемщиков настоятельно рекомендую запретить (cl_download_ingame 0), иначе попрут лаги. Причем, во включенном состоянии эта хрень продолжит скачивание всякого мусора даже в промежтках между загрузками серваком карт. По умолчанию cl_download_ingame включено.


  • Настройка ролей клиента и сервера в игре:

    Все перечисленные здесь переменные можно прописать в конфиге .\HalfLife\cstrike\config.cfg, хотя их значения могут быть изменены и в консоли.

    cl_lc 0-1 Эта переменная говорит серверу, желаете ли Вы или нет использовать компенсацию лага. Если компенсация откровенно достала вас своими глюками, можете вырубить ее, поставив ноль. Тогда играйте в соответствии с вашим реальным пингом, но учтите, что если пинга вам не хватит, то вы получите пошаговую стратегию, а не игру в реальном времени. По умолчанию cl_lc = 1, т.е. компенсация лагов - включена.
    cl_lw 0-1 Эта переменная отвечает за возможность проигрывания звуков и анимации со стороны клиента. Если она включена (cl_lw 1), то все звуки и анимация будут проигрываться непосредственно на вашей машине, например, в момент активной пальбы, не дожидаясь соответствующего подтверждения от сервера. В таком подходе есть свои плюсы и минусы.

    Если опция выключена (cl_lw 0), то момент, когда вы увидете стреляющий ствол, зависит от вашего пинга, что так же означает что вы увидите палящее орудие одновременно с попаданиями вылетающими из него пуль (и никаких "обруливающих углы" снарядов). Проблема в том, что если включена компенсация лага, то вы не увидите характерных "фонтанчиков" от пуль, часто помогающих подкорректировать прицел. Это может обернуться против вас, особенно с автоматом, имеющем сильный разброс при стрельбе, например, AK-47.

    В случае, когда cl_lw включена (cl_lw 1), ваша машина должна сама генерировать случайный разброс и неточность при стрельбе. В результате места попадания пуль, которые вы будете видеть, могут не совпадать с теми, что происходят на сервере, который случайным образом генерирует свою неточность для вашего оружия. Короче, ваша тачка и сервер будут генерировать траектории пуль немного по-разному. В результате вы увидите то, что насчитал ваш компьютер, а на самом деле бдет происходить то, что насчитал сервер. Когда идет сильный разброс пуль(например, долгая очередь из калаша), то вероятность таких несовпадений повышается.

    Вобщем совет: если вы пользуетесь компенсацией лага, то включайте (cl_lw 1), а если не пользуетесь - выключайте (cl_lw 0). По умолчанию включено.
    cl_lb 0-1 Включает упрежденный (обсчитанный вами, а не сервером) показ крови (если на сервере это не запрещено). Отключение позволяет вам точно увидеть попали ли вы в противника по-настоящему. По умочанию выключено (cl_lb 0).


  • Настройка канала и количества передаваемой информации:

    cl_updaterate X Эта переменная контролирует число обновлений, запрашиваемых у сервера (позиции игроков, местоположение трупов и дырок от пуль) в течение секунды. По умочанию значение 20. Сидя на выделенке значение можно ставить 30-40, однако, когда сервер полный, лучше установить cl_updaterate 25 и меньше. Модемщикам показано значение 20, однако на скорости 33600 на полном серваке лучше снизить cl_updaterate до 15. При игре по локалке смело ставьте cl_updaterate 50. "Рывки" при движении игрока трудно заметить, если его cl_updaterate выше 13. Единственная ситуация, когда низкие значения cl_updaterate становятся ощутимыми, когда все вокруг движется очень быстро. Например, ракета летящая вам в дыню…
    cl_cmdrate X Эта штучка подобна предыдущей cl_updaterate, за тем лишь исключением, что она контролирует число обновлений отсылаемых на сервер в течение секунды. Таким образом разделение потоков позволяет вам контролировать их независимо друг от дурга, в зависимости от того, какой у вас канал связи в каждую сторону. (Исходящий и входящий траффик может проходить с разной скоростью, например, на модемах с протоколом V.90 входящий трафик прокачивается бытсрее, со скоростями до 56 кбит/сек, а исходящий ограничен скоростью соединения 33.6 кбит/сек. Это не единственный пример, подобная ассиметричность распространена весьма широко. - прим. перев.). По умолчанию имеет значение 30.

    В связи с тем, что объем исходящего от вас траффика сильно не меняется, в отличие от объема входящего (особенно на полных серверах), то модемщики могут оставить cl_cmdrate равным 18-30. Пользователи с более "толстым" каналом, могут установить ее значение в 40-50. Для игры по локалке подойдет 50.
    rate X Указывает, какой объем информации вы сможете прокачать через ваше соединение с сервером в секунду за любое наперед заданое время. Начиная с версии HL 1.1.0.0. эта штука практически не работает, поэтому объем входящих данных рекомендуется ограничивать переменными <cl_updaterate>, <cl_cmdrate> и <cl_rate>
    cl_rate X Указывает вашей машине, какой объем данных, ей разрешено передать на сервер в секунду.


  • Рекомендуемые параметры:

    Тип модема rate cl_rate cl_updaterate cl_cmdrate
    Модем 14.4 Купи-ка, дружок, новый момед
    Модем 28.8 1800-2500 1000-1300 10-15 12-18
    Модем 33.6 2500-2900 1200-1800 12-18 18-25
    Модем 56k, Одноканальный ISDN 2900-3600 1500-1800 25 30
    Двухканальный ISDN 3500-7200 3500 30 40
    Кабельный модем, xDSL 3500-7500 30 40
    LAN (10/100 Mbps) 7500 и выше 50-100


    К сожалению, редко какое соединение стабильно настолько, что имеет одинаковый объем прокачки за одинаковое время. А это означает то, что для нирваны вам придется регулировать значения rate прямо в игре :) С помощью этой настройки вы получите хорошее представление о характере ваших соединений. Не бойтесь поэкспериментировать, если качетсво вашей связи не вписывается в границы, приведенные в таблице.

    Чтобы отыскать нужные вам значения, пользуйте в игре NetGraph (см. ниже). Если значения rate у вас слишком задрано, то возникнут характерные скачки пинга и ошибки потери пакетов. Если слишком низкое, то пакеты тоже могут потеряться - просто не дойдут все из-за rate-ограничений. Но вообще-то лучше ошибиться, слегка занизив rate, чем слишком его задрав. Так что будьте внимательны.

  • Получение статистики о загруженности канала:

    net_graph 1-3 Выведение графика состояния соединения и качества приема/передачи пакетов.
    net_graphwidth 220 Размер графика состояния соединения.
    net_graphpos 0-2 Позиция графика состояния соединения на экране. 0 - левый нижний угол, 1 - правый нижний угол, 2 - по центру внизу.
    Hosted by uCoz